<?php

/**
 * \file
 * Classe pour la gestion des sessions.
 */

namespace pilar\SessionManager /* \cond */ ; /* \endcond */
{

/**
 * Gestionnaire de session.
 *
 * \since 28/06/2009
 * \author Dirk Marski <dirk.marski@gmail.com>
 */
class DefaultSessionManager extends \pilar\Configurables\Configurable 
                         implements SessionManager {


/**
 * Paramètres de la session.
 */
private $_sessionVars = null;


/**
 * Préfixe pour les variables.
 */
private $_sessionPrefix = null;


/**
 * Manager d'authentification.
 */
private $_authenticationManager = null;


public function loadDefaultParams() {
 parent::loadDefaultParams();

 $this->defineParams(array(
  'sessionName' => PILAR_MAIN_PREFIX.'_'.PILAR_SESSION_NAME,
  'authenticationManagerParams' => array()
 ));
}


protected function initialize() {
	parent::initialize();
	
	$authenticationManagerParams = $this->param('authenticationManagerParams');
	$authenticationManagerParams['sessionManager'] = $this;
	
	$this->_sessionPrefix = PILAR_MAIN_PREFIX;
	$this->_authenticationManager = 
		new \pilar\AuthenticationManager\AuthenticationManager(
			$authenticationManagerParams
		);
}


public function setAuthenticationManager($authenticationManager) {
	$this->_authenticationManager = $authenticationManager;
}


public function start() {
	session_name($this->param('sessionName'));
	session_start();
	
	if (PILAR_SESSION_START_INSTRUCTIONS != '' &&
	 file_exists(DOCUMENT_ROOT.'/'.PILAR_SESSION_START_INSTRUCTIONS)) {
		include (DOCUMENT_ROOT.'/'.PILAR_SESSION_START_INSTRUCTIONS);
	}
}


public function init() {
	// Alias de code :
	 $sessionName = $this->param('sessionName');
	if (!isset($_SESSION[$sessionName]) || ($_SESSION[$sessionName] != 'true')) {
		$_SESSION[$sessionName] = 'true';
		$this->_sessionVars = array();
	} else {
		$this->loadSessionVars();
	}
}


public function checkAuthentication() {
	return $this->_authenticationManager->checkUser();
}

/**
 * Récupère les données en session.
 * 
 * \since 01/07/2009
 */
protected function loadSessionVars() {
	if (isset($_SESSION[$this->_sessionPrefix.'_sessionVars'])) {
		$this->_sessionVars =
			unserialize($_SESSION[$this->_sessionPrefix.'_sessionVars']);
	} else {
		$this->_sessionVars = array();
	}
}


/**
 * Sauvegarde les données en session.
 *
 * \since 01/07/2009
 */
protected function storeSessionVars() {
	$_SESSION[$this->_sessionPrefix.'_sessionVars'] =
		serialize($this->_sessionVars);
}


/**
 * Ferme la session.
 *
 * \since 28/06/2009
 */
public function close() {
 if (PILAR_SESSION_CLOSE_INSTRUCTIONS != '' &&
  file_exists(DOCUMENT_ROOT.'/'.PILAR_SESSION_CLOSE_INSTRUCTIONS)) {
  include (DOCUMENT_ROOT.'/'.PILAR_SESSION_CLOSE_INSTRUCTIONS);
 }
 
 $this->storeSessionVars();
 
 session_write_close();
}


/**
 * Destruction de la session.
 *
 * \since 28/06/2009
 */
public function destruct() {
 if (PILAR_SESSION_DESTRUCT_INSTRUCTIONS != '' &&
  file_exists(DOCUMENT_ROOT.'/'.PILAR_SESSION_DESTRUCT_INSTRUCTIONS)) {
  include (DOCUMENT_ROOT.'/'.PILAR_SESSION_DESTRUCT_INSTRUCTIONS);
 }

 session_destroy();
 unset($_SESSION);
 $_SESSION = array();
}


/**
 * Ajouter une variable dans la session.
 * Si la clef existe déjà, l'ancienne valeur est écrasée.
 * 
 * \param $key Clef de la variable.
 * \param $var Variable à stocker, il faut qu'elle soit sérialisable.
 * \since 01/07/2009
 */
public function addVar($key, $var) {
	$this->_sessionVars[$key] = $var;
}


/**
 * Efface une variable dans la session.
 * 
 * \param $key Clef de la variable.
 * \since 01/07/2009
 */
public function deleteVar($key) {
	unset($this->_sessionVars[$key]);
}


/**
 * Récupère une variable de session.
 * 
 * \param $key Clef de la variable.
 * \return Variable ayant la clef, \c NULL si la variable spécifiée n'existe
 * pas.
 * \since 01/07/2009
 */
public function getVar($key) {
	if (isset($this->_sessionVars[$key])) {
		return $this->_sessionVars[$key];
	}
	
	return null;
}


public function getAuthenticationManager() {
	return $this->_authenticationManager;
}


/**
 * !!! FOR DEBUG USE ONLY !!!
 */
public function getSessionVars() {
	return $this->_sessionVars;
}


public function getUserId() {
	return $this->_authenticationManager->getUserId();
}


} // Class.

} // Namespace
